const sm2 = require('sm-crypto').sm2


let publicKey = '';
let privateKey = '';

function generateKey() {

    let keypair = sm2.generateKeyPairHex()  //生成公私钥

    publicKey = keypair.publicKey // //获取公钥
    console.log("初始化公钥为：" + publicKey)
    privateKey = keypair.privateKey // //获取私钥
    console.log("初始化私钥为：" + privateKey)

}

/*
    SM2非对称加密的加密方法
    参数: 公钥、要加密的字符串
 */
function encryptData(publicKey, msgString) {

    // 如果没有公钥就用默认的公钥解密
    if (publicKey === ''){
        publicKey = this.publicKey
    }

    // 设置密钥加密方式，默认为1即可。
    // SM2非对称加密的结果由C1,C2,C3三部分组成。
    // 其中C1是生成随机数的计算出的椭圆曲线点，C2是密文数据，C3是SM3的摘要值。最开始的国密标准的结果是按C1C2C3顺序的，新标准的是按C1C3C2顺序存放的
    const cipherMode = 1 // 1 - C1C3C2，0 - C1C2C3，默认为1
    // let msgString = "{\"From\":\"公安部门\",\"To\":\"lzz\",\"TokenId\":\"6号id\",\"UserName\":\"三号光头\",\"Data\":\"账号数据\",\"Signature\":\"签名\",\"SignType\":\"sm2\",\"NftSymbol\":\"IDNFT2\"}"
    // 进行加密
    let encryptData = sm2.doEncrypt(msgString, publicKey, cipherMode) // 加密结果
    console.log("加密结果：" + encryptData)
    return encryptData
}

/*
    SM2非对称加密的解密方法
    参数: 私钥、要解密的字符串
 */
function decryptData(privateKey, msgString) {

    // 如果没有私钥就用默认的私钥解密
    if (privateKey === ''){
        publicKey = this.privateKey
    }

    // 设置密钥加密方式，默认为1即可。
    // SM2非对称加密的结果由C1,C2,C3三部分组成。
    // 其中C1是生成随机数的计算出的椭圆曲线点，C2是密文数据，C3是SM3的摘要值。最开始的国密标准的结果是按C1C2C3顺序的，新标准的是按C1C3C2顺序存放的
    const cipherMode = 1 // 1 - C1C3C2，0 - C1C2C3，默认为1

    // 进行解密
    let decryptData = sm2.doDecrypt(msgString, privateKey, cipherMode) // 解密结果
    console.log("解密结果：" + decryptData)
    return decryptData
}

export default {
    generateKey,
    encryptData,
    decryptData
}



// sm2Utils.js的使用代码案例
// let publicKey = '04438cc5322504c74ad0259597e7ec3a6ff71f41328a52ce9aa6aa58c8eca44e9c9f441a37be3bf25d83eef800303f49d652902e0b09aaeb1ea40afdc3b9b25b79'
// let privateKey = 'e6d9cc598c55fc2a053caae62db0a9ed6966b1f9cdf6b6b60f4d626528a162c9'
// let encryptMsg = this.sm2.encryptData(publicKey, '武汉')
// this.sm2.decryptData(privateKey, encryptMsg)